// 饭卡声明文件
#ifndef CARD_HPP
#define CARD_HPP

#include <string>
#include <iostream>
#include <mutex>

class Card
{                                                                                                                                                                                                                                          
private:
	std::string cardNum;
	std::string name;
	double balance;
	bool lost;

	// 线程安全字段
	mutable std::mutex mMutex;  // mutable允许const方法修改
public:
	Card(std::string cardNum, std::string name, double balance);
	~Card() = default; // 默认析构函数

	/**
	 * Card 类的拷贝构造函数和赋值运算符被隐式删除：
	 * 由于 Card 类中包含了 std::mutex 成员，而 std::mutex 是不可拷贝的，
	 * 因此 Card 的默认拷贝构造函数和赋值运算符被删除。
	 */
	// 需要移动拷贝构造和移动赋值运算符的重载
	
	// 删除拷贝构造函数和赋值运算符
    Card(const Card&) = delete;
    Card& operator=(const Card&) = delete;

    // 添加移动构造函数和移动赋值运算符
    Card(Card&& other) noexcept;
    Card& operator=(Card&& other) noexcept;

	// 对外接口
	// getter
	std::string getCardNum() const;
	std::string getName() const;
	double getBalance() const;
	bool isLost() const;

	void consume(double amount);
	void recharge(double amount);
	void reportLost();

	// 回滚所需函数
	void cancelLost() {
		lost = false;
	}

	// 线程安全接口
	// 返回互斥锁引用
	std::mutex& getMutex() { 
		return mMutex;
	}  
	// const重载
	const std::mutex& getMutex() const { 
		return mMutex; 
	}  

};

#endif
